🤖 feat: ship generated install bundle and CI freshness checks - #89
Conversation
|
@codex review Please review the installer bundle generation and CI freshness check changes. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d749540f83
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review Addressed your feedback by diffing full generated CRD and RBAC directories in the freshness check. |
|
Codex Review: Didn't find any major issues. 🎉 ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
|
@codex review Follow-up change: split generated installer output into minimal and quickstart manifests, |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 988d23cd03
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@codex review Addressed the review comment by making the installer freshness job fail on untracked generated files too. |
|
Codex Review: Didn't find any major issues. Delightful! ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
Maintainer status: held
Owner: maintainer desk. #105 tracks restoring a supported quickstart path. Generated with |
Part of the PR #89 scope refresh (generated install bundle). Pin sigs.k8s.io/kustomize/kustomize/v5 v5.8.1 as a go.mod tool so the installer bundle can be built with "go tool kustomize" from the vendor tree. The module graph only gains kustomize and its requirements (kustomize api, cmd/config and kyaml v0.21.1, go-errors v1.4.2, go-gitignore, treeprint v1.2.0; sergi/go-diff v1.4.0 was already selected and is now listed). No existing module version changes. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `xhigh`_ Change-Id: I7f7eabd4d9e246debb09df4a46eb564a98fdfd15 Signed-off-by: Thomas Kosiewski <tk@coder.com>
Part of the PR #89 scope refresh. hack/update-manifests.sh now also writes the kustomization.yaml files for config/crd/bases and config/rbac, and config/default composes the coder-system namespace, the CRDs, the RBAC, the operator Deployment and the aggregated API Service and APIService. "make build-installer" runs the manifest generation and renders config/default with the vendored kustomize into dist/install.yaml, the single install bundle for the operator and the aggregated API server. The minimal and quickstart variants from the earlier PR #89 heads are intentionally not included. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `xhigh`_ Change-Id: I3214b59ca5f2bdd9efd3d525b3fdc767bca4983f Signed-off-by: Thomas Kosiewski <tk@coder.com>
Part of the PR #89 scope refresh, adapted to the current ci.yaml. A new installer-manifest job runs "make build-installer" and fails on any diff in dist/install.yaml, config/crd/bases or config/rbac, or on untracked files under those paths. It runs in the merge queue and on changes to Go code, the manifest inputs, the bundle or this workflow; publish-main waits for it. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `xhigh`_ Change-Id: Ie73e1493152ed070a898d1e5a87fa526db97c2ad Signed-off-by: Thomas Kosiewski <tk@coder.com>
Part of the PR #89 scope refresh. The tutorial installs the operator and the aggregated API server with the single dist/install.yaml bundle instead of applying CRDs, RBAC and the Deployment one by one, and states that the bundle does not deploy Coder itself. Cleanup deletes the sample control plane first and then the bundle. The minimal and quickstart installer variants are not documented. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `xhigh`_ Change-Id: I747a9c08b7486bad564a86f64f526eb29d140310 Signed-off-by: Thomas Kosiewski <tk@coder.com>
Part of the PR #89 scope refresh, after desk review. The separate installer-manifest job was not a required status check, so a stale dist/install.yaml could still pass the merge queue. Move the "Verify installer manifests are up to date" step into the required lint job, right after the API reference docs check, and run lint on pull requests that touch installer inputs (the installer path filter) as well as Go code. The merge queue already always runs lint. publish-main no longer references the removed job. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `xhigh`_ Change-Id: Id3d099067fa18cce9e63009e279d6725df146cc9 Signed-off-by: Thomas Kosiewski <tk@coder.com>
Part of the PR #89 scope refresh, rebased onto main c942c97. "make manifests build-installer" picks up spec.database.connectionSecretRef and its validation rules from the regenerated CoderControlPlane CRD. No other generated file changed. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `xhigh`_ Change-Id: I6cd893fdad04fa3c352a9e55a01cd480f9153f0f Signed-off-by: Thomas Kosiewski <tk@coder.com>
bd2d2e2 to
2a11bd7
Compare
Refreshed and back in reviewThis PR was rebuilt on current
The description has the details and the KIND validation, installing only through the bundle. Generated with |
…tl -f PR #89's Kind E2E failed at "Apply namespace, CRDs, and RBAC": the generated config/crd/bases/kustomization.yaml and config/rbac/kustomization.yaml were picked up by "kubectl apply -f config/crd/bases/" and "-f config/rbac/" ("no matches for kind Kustomization"). README, CONTRIBUTING, several how-to pages, examples/cloudnativepg and hack/kind-dev.sh apply those directories the same way. Remove both files. hack/update-manifests.sh now generates config/default/kustomization.yaml itself, listing every CRD and RBAC file individually next to the namespace and deploy manifests, and fails if either directory contains a kustomization.yaml. The freshness check also covers config/default. dist/install.yaml is byte-identical to the previous bundle. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `xhigh`_ Change-Id: I0776cd798d2dcf50b47291b15d2b0d3fee9a61c0 Signed-off-by: Thomas Kosiewski <tk@coder.com>
list_manifests ran inside process substitution, so its assertion (for example a kustomization.yaml in config/rbac/) printed an error but the script still exited 0 and wrote config/default/kustomization.yaml. Capture the lists with command substitution so set -e stops the script. Verified: the negative case now exits 1, and dist/install.yaml is unchanged (sha256 4fedcc2e...). Part of the PR #89 scope refresh. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `xhigh`_ Change-Id: Id840489a3ae2bb2c900f0e1c4cde557963917f62 Signed-off-by: Thomas Kosiewski <tk@coder.com>
|
@codex review |
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b2db158db4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Addresses two findings from the PR #89 review. controller-gen does not delete CRD YAML for removed or renamed API types, and update-manifests.sh now enumerates config/crd/bases into config/default and dist/install.yaml, so a stale CRD would keep shipping. The script now clears the fully generated config/crd/bases/*.yaml before running controller-gen. config/rbac also holds hand-written manifests, so only its generated role.yaml is removed beforehand, and the script fails if controller-gen does not write it again. The getting-started prerequisites now list every kind the bundle creates, including the Service and the apiregistration.k8s.io/v1 APIService. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `xhigh`_ Change-Id: Ib105db926f0ac700da81838b2b5742c6ce23a766 Signed-off-by: Thomas Kosiewski <tk@coder.com>
|
@codex review |
|
@codex security review |
|
Codex Review: Didn't find any major issues. 🚀 Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
There was a problem hiding this comment.
🛡️ Codex Security Review
Here are some automated security review suggestions for this pull request.
Reviewed commit: 3fac85b7fc
ℹ️ About Codex security reviews in GitHub
This is an experimental Codex feature. Security reviews are triggered when:
- You comment "@codex security review"
- A regular code review gets triggered (for example, "@codex review" or when a PR is opened), and you’re opted in so security review runs alongside code review
Once complete, Codex will leave suggestions, or a comment if no findings are found.
Part of the PR #89 scope refresh: narrow the install bundle to what the getting-started tutorial needs. - config/default/controller-mode-patch.yaml runs the bundled Deployment with --app=controller and drops the container ports that mode does not serve. deploy/deployment.yaml keeps its defaults. - hack/update-manifests.sh lists the patch in the generated config/default/kustomization.yaml and no longer adds the aggregated API Service and APIService. It leaves out auth-delegator-binding.yaml and authentication-reader-binding.yaml, which only the aggregated API server uses; they stay in config/rbac for kubectl apply -f config/rbac/. - dist/install.yaml now holds the namespace, CRDs, ServiceAccount, ClusterRole, ClusterRoleBinding and the controller Deployment. - getting-started lists those permissions, says the bundle installs the operator in controller mode, and links the aggregated API server how-to. _Generated with [`xum`](https://github.com/coder/xum) • Model: `anthropic:claude-opus-5-5` • Thinking: `xhigh`_ Change-Id: I7839947ff2013c74d55d612ab3c612721d9cd121 Signed-off-by: Thomas Kosiewski <tk@coder.com>
|
@codex review |
|
@codex security review |
|
Codex Review: Didn't find any major issues. More of your lovely PRs please. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
🛡️ Codex Security ReviewSecurity review completed. No security issues were found in this pull request. Reviewed commit: Only the user who started this review can view the report in Codex. ℹ️ About Codex security reviews in GitHubThis is an experimental Codex feature. Security reviews are triggered when:
Once complete, Codex will leave suggestions, or a comment if no findings are found. |
|
Landed as f2a8e81. The squash tree matched the reviewed head merged onto One regression: the Generated with |
Summary
Adds a generated, single-file install bundle,
dist/install.yaml, so the operator installs with onekubectl apply. The bundle runs the operator in controller mode only. A CI check keeps the bundle in sync with its sources. The getting-started guide now uses the bundle.Background
Installing meant applying ten CRD, RBAC and Deployment files one by one. This PR was opened in February and held. Its quickstart path did not converge on repeated apply (#105, since fixed by #116), and its review budget had run out. The maintainer has since extended that budget. The PR has been rebuilt on current
mainwith a reduced scope.Scope refresh (2026-09-24):
dist/install.yaml, the kustomize sources behind it, a freshness check and the getting-started update.dist/minimal-installer.yaml, which was byte-identical todist/install.yaml, plus the quickstart manifests (config/quickstart/*,dist/quickstart-installer.yaml). Restoring a supported quickstart is separate follow-up work that depends on 🤖 fix: handle template imports that outlast the request deadline #117.config/default/controller-mode-patch.yamlruns the bundled Deployment with--app=controllerand drops the container ports that mode does not serve.deploy/deployment.yamland the per-file manifests are unchanged; the aggregated API server keeps its own how-to.bd2d2e2dand the private candidate are preserved.Implementation
go tool. This adds seven modules and changes no existing module versions;vendor/gains only new files.config/default/kustomization.yamlcombines thecoder-systemnamespace, the CRDs, the controller's RBAC and the operator Deployment, patched to--app=controller.hack/update-manifests.shwritesconfig/default/kustomization.yamlwith each CRD and RBAC file listed individually.config/crd/bases/andconfig/rbac/stay free of kustomization files, so the existingkubectl apply -f config/crd/bases/ -f config/rbac/installs in the README, docs,hack/kind-dev.shand the E2E keep working. The script stops if a kustomization file appears there. An earlier revision of this refresh broke those installs, and the PR's Kind E2E caught it.make build-installerregeneratesdist/install.yaml(write to a temp file, then rename). Two runs are byte-identical.lintjob regenerates the bundle and fails on any diff or untracked generated file. Enforcement comes from the existing required check, so no branch-protection change is needed.lintnow also runs on PRs that change installer inputs.docs/tutorials/getting-started.mdinstalls from$BASE/dist/install.yaml, in the style of 🤖 refactor: rewrite README and docs for readability #123. It says what the bundle does not install, and it documents a safe cleanup order: control plane first, then the bundle.Validation
govulncheck(run on an earlier head with the samego.mod) reports only the known module-level GO-2026-5932. The kustomize modules have no advisories.dist/fails; a new file inconfig/rbac/without regenerating fails; the clean tree passes.kubectl apply -f config/e2e/namespace.yaml,-f config/crd/bases/,-f config/rbac/and the README's combined command succeed on a throwaway KIND cluster. On the previous revision they failed with the same error as CI.spec.database.connectionSecretReffield from 🤖 feat: reference the external PostgreSQL Secret from CoderControlPlane #122.dist/install.yamlsha2561d04b902…). Nothing was pre-applied. The applied copy differs fromdist/install.yamlonly in the operator image tag andimagePullPolicy, because the image was built from this source and loaded into the cluster.kubectl applycreates only the Namespace, 3 CRDs, ServiceAccount, ClusterRole, ClusterRoleBinding and Deployment. The pod runs with--app=controllerand declares only the health port. The APIServicev1alpha1.aggregation.coder.comdoes not exist.CoderControlPlanereachesReady, and its Deployment and Service come up.ReadywithDatabaseSecretResolved=True. Those steps were not repeated on the controller-only bundle.Accelerated replays of the install and control-plane steps (idle gaps trimmed, so durations are shorter than wall time):
A-install.webm
B-controlplane.webm
Risks
kubectl apply -f deploy/does: users who want the aggregated API server follow its how-to.ghcr.io/coder/coder-k8s:latestimage asdeploy/deployment.yaml. The tutorial says to pin a release tag and the image for reproducible installs.Generated with
xum• Model:anthropic:claude-opus-5-5• Thinking:xhigh• Cost:$1622.82